/**
 * getRandom - 获取某个范围内的随机整数的函数
 * @param {number} a 表示范围的数字
 * @param {number} b 表示范围的数字
 * @return {number} 返回范围内的随机数
 */
function getRandom(a, b) {
    // var max = a;
    // var min = b;
    // if(a<b){
    //     max = b;
    //     min = a
    // }
    var max = Math.max(a, b)
    var min = Math.min(a, b)
    return parseInt(Math.random() * Math.abs(a - b)) + min
}
/**
 * getColor 获取随机颜色值的函数
 * @param {boolean} hex 是否要16进制的颜色值
 * @return {string} 返回的是颜色值
 */
function getColor(hex) {
    // 判断是否需要16进制的颜色值 - hex是不是true
    if (hex === true) {
        var color = '#';
        for (var i = 0; i < 3; i++) {
            var num = getRandom(0, 256)
            num = num.toString(16)
            num = num.length === 1 ? '0' + num : num;
            color += num
        }
    } else {
        // var arr = []
        // for(var i=0;i<3;i++){
        //     var num = getRandom(0,256)
        //     arr.push(num)
        // }
        // var color = 'rgb(' + arr.join(',') + ')'

        var color = 'rgb(';
        var f = '';
        for (var i = 0; i < 3; i++) {
            color += f + getRandom(0, 256)
            f = ','
        }
        color += ')'
    }
    return color;
}
/**
 * getStyle 万能的获取样式的函数
 * @param {node} ele 要获取样式的标签对象
 * @param {string} attr 要获取的css的键
 * @return {string} 返回的是获取到的样式的值
 */
function getStyle(ele, attr) {
    try {
        return getComputedStyle(ele)[attr]
    } catch (err) {
        return ele.currentStyle[attr]
    }
}
/**
 * 兼容的事件侦听器
 * @param {node} ele 要绑定事件的标签元素
 * @param {string} type 事件类型
 * @param {function} handler 事件处理函数
 */
function bindEvent(ele, type, handler) {
    if (ele.addEventListener) {
        ele.addEventListener(type, handler)
    } else if (ele.attachEvent) {
        ele.attachEvent("on" + type, handler)
    }
}
/**
 * 兼容的事件侦听器对应的解绑函数
 * @param {node} ele 要解绑事件的标签元素
 * @param {string} type 事件类型
 * @param {function} handler 事件处理函数
 */
function unBind(ele, type, handler) {
    if (ele.removeEventListener) {
        ele.removeEventListener(type, handler)
    } else if (ele.detachEvent) {
        ele.detachEvent('on' + type, handler)
    }
}
/**
 * 批量设置样式的函数
 * @param {node} ele 要修饰样式的标签对象
 * @param {object} obj css键值对组成的对象
 */
function setStyle(ele, obj) {
    for (var attr in obj) {
        ele.style[attr] = obj[attr]
    }
}
/**
 * animate动画函数
 * @param {node} ele 要进行动画的元素
 * @param {object} obj 要进行动画的css键值对
 * @param {function} fn 所有动画结束后执行的函数
 */
function animate(ele, obj, fn = function () { }) {
    let num = 0
    for (let attr in obj) {
        num++
        let target = obj[attr]
        if (attr === 'opacity') {
            target *= 100
        }
        let currentStyle = getStyle(ele, attr)
        if (attr === 'opacity') {
            currentStyle *= 100
        }
        currentStyle = parseInt(currentStyle)
        let timerId = setInterval(function () {
            let speed = (target - currentStyle) / 10
            speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed)
            currentStyle += speed
            if (attr === 'opacity') {
                ele.style[attr] = currentStyle / 100
            } else {
                ele.style[attr] = currentStyle + 'px'
            }
            if (currentStyle === target) {
                clearInterval(timerId)
                num--
                if (num === 0) {
                    fn()
                }
            }
        }, 20)
    }
}
/**
 * 发送ajax
 * @param {object} obj 
 */
function sendAjax(obj) {
    if (obj.url === undefined) {
        throw new Error('地址必填')
    }
    if (typeof obj.url !== 'string') {
        throw new Error('地址必须是字符串')
    }
    if (obj.method === undefined) {
        obj.method = 'get'
    }
    if (obj.method.toLowerCase() !== 'get' && obj.method.toLowerCase() !== 'post') {
        throw new Error('请求方式必须是get或post')
    }
    if (obj.success === undefined) {
        obj.success = function () { }
    }
    if (typeof obj.success !== 'function') {
        throw new Error('success必须是函数')
    }
    if (obj.data !== undefined) {
        if (typeof obj.data === 'string') {
            var str = obj.data
        } else if (typeof obj.data === 'object') {
            var str = '';
            for (var attr in obj.data) {
                str += '&' + attr + '=' + obj.data[attr]
            }
            str = str.slice(1)
        } else {
            throw new Error('数据必须是字符串或对象')
        }
        if (obj.method.toLowerCase() === 'get') {
            obj.url += '?' + str
        }
    }
    var xhr = new XMLHttpRequest;
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
            if (xhr.status >= 200 && xhr.status < 300) {
                var res = xhr.responseText;
                obj.success(res)
            }
        }
    }
    xhr.open(obj.method, obj.url)
    // 判断是否传递了令牌
    // 判断浏览器中是否存了令牌
    var token = localStorage.getItem('token')
    if (token) {
        xhr.setRequestHeader('authorization', token)
    }
    if (obj.method.toLowerCase() === 'post' && obj.data) {
        xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
        xhr.send(str)
        return
    }
    xhr.send()
}


function promiseAjax(obj) {
    return new Promise(function (resolve, reject) {
        if (obj.url === undefined) {
            throw new Error('地址必填')
        }
        if (typeof obj.url !== 'string') {
            throw new Error('地址必须是字符串')
        }
        if (obj.method === undefined) {
            obj.method = 'get'
        }
        if (obj.method.toLowerCase() !== 'get' && obj.method.toLowerCase() !== 'post') {
            throw new Error('请求方式必须是get或post')
        }
        if (obj.data !== undefined) {
            if (typeof obj.data === 'string') {
                var str = obj.data
            } else if (typeof obj.data === 'object') {
                var str = '';
                for (var attr in obj.data) {
                    str += '&' + attr + '=' + obj.data[attr]
                }
                str = str.slice(1)
            } else {
                throw new Error('数据必须是字符串或对象')
            }
            if (obj.method.toLowerCase() === 'get') {
                obj.url += '?' + str
            }
        }
        var xhr = new XMLHttpRequest;
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
                if (xhr.status >= 200 && xhr.status < 300) {
                    var res = xhr.responseText;
                    resolve(res)
                } else {
                    reject()
                }
            }
        }
        xhr.open(obj.method, obj.url)
        var token = localStorage.getItem('token')
        if (token) {
            xhr.setRequestHeader('authorization', token)
        }
        if (obj.method.toLowerCase() === 'post' && obj.data) {
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
            xhr.send(str)
            return
        }
        xhr.send()
    })
}
